home *** CD-ROM | disk | FTP | other *** search
/ PC Media 7 / PC MEDIA CD07.iso / share / prog / ooav3 / ooavarj.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-05-22  |  2.8 KB  |  107 lines

  1. {
  2.         Object-Oriented Archive-viewer: ARJ-part
  3. }
  4.  
  5. unit OOAVArj;
  6.  
  7. interface
  8.  
  9. uses      Dos,OOAV;
  10.  
  11. Type      AFHeader = Record
  12.                        HeadId  : Word;                         { 60000 }
  13.                        BHdrSz  : Word;             { Basic Header Size }
  14.                        FHdrSz  : Byte;              { File Header Size }
  15.                        AVNo    : Byte;
  16.                        MAVX    : Byte;
  17.                        HostOS  : Byte;
  18.                        Flags   : Byte;
  19.                        SVer    : Byte;
  20.                        FType   : Byte;    { must be 2 for basic header }
  21.                        Res1    : Byte;
  22.                        DOS_DT  : LongInt;
  23.                        CSize   : LongInt;            { Compressed Size }
  24.                        OSize   : LongInt;            { Original Size }
  25.                        SEFP    : LongInt;
  26.                        FSFPos  : Word;
  27.                        SEDLgn  : Word;
  28.                        Res2    : Word;
  29.                        NameDat : array[1..120] of char;{ start of Name, etc. }
  30.                        Res3    : array[1..10] of char;
  31.                      end;
  32.  
  33.  
  34. type      PArjArchive=^TArjArchive;
  35.           TArjArchive=object(TGeneralArchive)
  36.                         constructor Init;
  37.                         procedure FindFirst(var sr:SearchRec);virtual;
  38.                         procedure FindNext(var sr:SearchRec);virtual;
  39.                       private
  40.                         _FHdr:AFHeader;
  41.                         _SL:longint;
  42.                         procedure GetHeader(var sr:SearchRec);
  43.                       end;
  44.  
  45. implementation
  46.  
  47. const     BSize=4096;
  48. var       BUFF:array[1..BSize] of Byte;
  49.  
  50.  
  51.  
  52. constructor TArjArchive.Init;
  53. begin
  54.   FillChar(_FHdr,sizeof(_FHdr),0);
  55. end;
  56.  
  57.  
  58. procedure TArjArchive.GetHeader(var sr:SearchRec);
  59. var       bc:word;
  60.           b:byte;
  61. begin
  62.   FillChar(_FHdr,SizeOf(_FHdr),#0);
  63.   FillChar(BUFF,BSize,#0);
  64.   Seek(_FArchive,_SL);
  65.   BlockRead(_FArchive,BUFF,BSIZE,bc);
  66.   Move(BUFF[1],_FHdr,SizeOf(_FHdr));
  67.   with _FHdr do
  68.   begin
  69.     if BHdrSz>0 then
  70.     begin
  71.       b:=1;sr.Name:='';
  72.       while NameDat[b]<>#0 do
  73.       begin
  74.         if NameDat[b]='/' then
  75.           sr.Name:=''
  76.         else
  77.           sr.Name:=sr.Name+NameDat[b];
  78.         inc(b);
  79.       end;
  80.       sr.Size:=BHdrSz+CSize;
  81.       if FType=2 then sr.Size:=BHdrSz;
  82.       if BHdrSz=0 then sr.Size:=0;
  83.       inc(_SL,sr.Size+10);
  84.       sr.Time:=DOS_DT;
  85.     end;
  86.   end;
  87. end;
  88.  
  89.  
  90. Procedure TArjArchive.FindFirst(var sr:SearchRec);
  91. begin
  92.   _SL:=0;
  93.   GetHeader(sr);
  94.   GetHeader(sr);
  95. { Why a call to GetHeader() twice?
  96.   Because ARJ stores the name of the archive in the first field }
  97. end;
  98.  
  99.  
  100. procedure TArjArchive.FindNext(var sr:SearchRec);
  101. begin
  102.   GetHeader(sr);
  103. end;
  104.  
  105.  
  106. end.
  107.